package com.xzzz.common.wechat.security;

import cn.hutool.core.util.StrUtil;
import com.xzzz.common.base.exception.XzException500;
import com.xzzz.common.base.util.json.JsonUtil;
import com.xzzz.common.wechat.pojo.WxPhoneNumberDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;

/**
 * 微信加密信息解密工具类
 *
 * @author xzzz
 * 
 * @since 2.0.1 增加微信验证票据解密
 */
@Slf4j
public class WxEncryptedDataUtil {

    /**
     * 手机加密信息解密
     * @param appId          appId
     * @param sessionKey     后端获取: sessionKey, 用户code获取
     * @param iv             前端获取: iv
     * @param encryptedData  前端获取: 密文
     * @return 解密后的手机信息
     */
    public static WxPhoneNumberDTO decryptPhone(String appId, String sessionKey, String iv, String encryptedData) {
        String result = decrypt(sessionKey, iv, encryptedData);
        log.debug("[微信解密] 用户手机信息解密明文: {}", result);
        if (StrUtil.isBlank(result)) {
            throw new XzException500("无法解析用户手机相关信息");
        }
        try {
            WxPhoneNumberDTO wxPhoneNumberDTO = JsonUtil.toObj(result, WxPhoneNumberDTO.class);
            if (wxPhoneNumberDTO != null && wxPhoneNumberDTO.getWatermark().getAppid().equals(appId)) {
                return wxPhoneNumberDTO;
            }
            log.error("[微信解密] 用户手机信息解密明文: {}", result);
            throw new XzException500("用户手机相关信息非本APP");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("[微信解密] 用户手机信息解密明文: {}", result);
            throw new XzException500("无法解析用户手机相关信息");
        }
    }


    /**
     * 解密
     * @param sessionKey     后端获取: sessionKey, 用户code获取
     * @param iv             前端获取: iv
     * @param encryptedData  前端获取: 密文
     * @return 解密后的明文
     */
    private static String decrypt(String sessionKey, String iv, String encryptedData) {
        String result = null;
        // 解密为明文
        byte[] resultByte = AESCBCUtil.decrypt(Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv), Base64.decodeBase64(encryptedData));
        if(null != resultByte && resultByte.length > 0) {
            // 删除解密后明文的补位字符
            result = new String(PKCS7Encoder.decode(resultByte));
        }
        return result;
    }


//    @SuppressWarnings("All")
//    public static void main(String[] args) {
//        String appId = "";
//
//        // 手机号解密
//        String phone_sessionKey = "H+8CZBsBa42T4smTZsjK8A==";
//        String phone_iv = "sYP77g2wafjpdgtTNL4Vlw==";
//        String phone_encryptedData = "QbYwGFqqTYpQ1tbWZ4pQpLxPK+6higNDtugjOsPTfNe2GVKVijK8z0M2vimwkdLbznGKYDhkKXr+1wF4gTLSNCiqiHku7WVnzTfGmVxtlh0g9XG2bs48MutydwyLqHrdyAtJgQj3ZdhBsTniTa7uo4+kwvcJRM0VQslw9UI5UdqbBObMr6RIAUnVglOgKZirdFsoMlALsCZ7pHHfYcBKFQ==";
//        System.out.println(decryptPhone(appId,  phone_sessionKey, phone_iv, phone_encryptedData).toString());
//    }

}
